#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sys/timerfd.h>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>

int main()
{
    struct itimerspec newtime;

    // 第一次超时时间
    newtime.it_value.tv_sec = 1;
    newtime.it_value.tv_nsec = 0;
    // 之后的每次超时时间
    newtime.it_interval.tv_sec = 1;
    newtime.it_interval.tv_nsec = 0;

    // 创建一个文件并返回该文件的文件描述符
    int timerfd = timerfd_create(CLOCK_MONOTONIC, 0);
    if(timerfd < 0)
    {
        perror("timerfd_creat error");
        return -1;
    }
    // 设置OS对定时器文件的写入操作
    timerfd_settime(timerfd, 0, &newtime, nullptr);
    for(int n = 3; n > 0; n--)
    {
        uint64_t times;
        if(n != 3)
            sleep(3);
        // 定时器文件每次只会写入8字节的数据，用无符号的64位int(8字节)类型对象来存储
        // 读取定时器文件
        int m = read(timerfd, &times, 8);
        if(m < 0)
        {
            perror("recv error");
            return -1;
        }
        std::cout << "距离上一次超时的次数: " << times << std::endl;
    }
    return 0;
}